package Day_0130;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author zxc
 * @date 2023/01/30 19:49
 **/
public class QuoteDemo {
    public static void main(String[] args) {
        /**
         * （1）强引用 ：
         *  强引用是平常中使用最多的引用，强引用在程序内存不足（OOM）的时候也不会被回收;
         */
        String str = new String("str");
        System.out.println(str);

        /**
         * （2）软引用 ：
         *  软引用在程序内存不足时，会被回收，
         */
        // 注意：wrf这个引用也是强引用，它是指向SoftReference这个对象的，
        // 这里的软引用指的是指向new String("str")的引用，也就是SoftReference类中T
        SoftReference<String> wrf = new SoftReference<String>(new String("str"));
        System.out.println(wrf);

        /**
         * （3）弱引用 ：
         *  弱引用就是只要JVM垃圾回收器发现了它，就会将之回收;
         */
        WeakReference<String> wrf2 = new WeakReference<String>(str);
        System.out.println(wrf2);

        /**
         * （4）虚引用 ：
         *  虚引用的回收机制跟弱引用差不多，但是它被回收之前，会被放入 ReferenceQueue 中。
         *  注意，其它引用是被JVM回收后才被传入 ReferenceQueue 中的。
         *  由于这个机制，所以虚引用大多被用于引用销毁前的处理工作。还有就是，虚引用创建的时候，必须带有 ReferenceQueue
         */
        PhantomReference<String> prf = new PhantomReference<String>(new String("str"),
                new ReferenceQueue<>());
        System.out.println(prf);
    }
}
